package 每日一题;

import java.util.HashMap;
import java.util.Map;

/**
 * @author: TTDB
 * @create: 2025/9/24
 */
public class fractionToDecimal {
    public String fractionToDecimal(int numerator, int denominator) {
        //给一个分数，以字符串的形式返回小数，numerator/denominator
        // 如果结果小数部分为循环小数，则将循环部分括号括起来
        //没啥思路----长除法
        StringBuilder res = new StringBuilder();
        //1.int转long
        long num = numerator;
        long den = denominator;
        //2.看看是不是整除
        if (num % den == 0) {
            return String.valueOf(num / den);
        }
        //3.判断正负
        if (num * den < 0) {
            res.append("-");
        }
        //整数部分
        num = Math.abs(num);
        den = Math.abs(den);
        long integer = num / den;
        res.append(integer);
        res.append(".");
        //小数部分
        StringBuilder fraction = new StringBuilder();
        Map<Long, Integer> map = new HashMap<>();
        long remainder = num % den;
        int index = 0;
        //如何判断是否找到循环节？注意到对于相同的余数，计算得到的小数的下一位数字一定是相同的，因此如果计算过程中发现某一位的余数在之前已经出现过，则为找到循环节
        while (remainder != 0 && !map.containsKey(remainder)) {//等于0或者循环
            //这个长除法这部分理解一下----就是一个出发计算罢了，用一个map来存储出现的数字，如果重复就跳出
            // 记录当前余数对应的位置，用于处理循环小数
            map.put(remainder, index);
            // 将余数扩大10倍，为下一次除法做准备
            remainder *= 10;
            // 计算当前小数位的数字并添加到结果中
            fraction.append(remainder / den);
            // 更新余数为除法的余数部分
            remainder %= den;
            // 移动到下一个小数位
            index++;

        }
        if(remainder != 0){//说明重复
            fraction.insert(map.get(remainder), "(");
            fraction.append(")");
        }
        res.append(fraction);
        return res.toString();
    }
}
